# -*- coding: utf-8 -*-
"""GENERATOR PERANGKAT AJAR — ATP + RPM + KKTP dalam satu pintu
===========================================================================

Satu kali pengisian data pokok (mata pelajaran, kelas, JP, minggu efektif,
identitas guru) dipakai bersama oleh ketiga dokumen, sehingga ATP, RPM, dan
KKTP selalu sinkron: elemen, Capaian Pembelajaran, rumusan Tujuan Pembelajaran,
jumlah pertemuan, dan alokasi waktunya berasal dari satu mesin yang sama.

Identitas terakhir disimpan pada berkas identitas.json, jadi pemakaian
berikutnya tidak perlu mengisi ulang nama dan NPA.

Jalankan:  py atpgen/generator.py
"""
from __future__ import print_function

import io
import json
import os
import sys

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

import atp
import kktp
import rpm
from atp import (BASE_OUT, KELAS_FASE, KEPALA_NAMA, KEPALA_NPA, TITIK,
                 cari_mapel, load_db, npa_teks, semester_aktif)
from rpm import daftar_tp, detail_aktif, topik_utama

SIMPANAN = os.path.join(os.path.dirname(os.path.abspath(__file__)), "identitas.json")
BAWAAN = {
    "mapel": "", "kelas": "X", "jp": 2, "jpp": 2, "mg": 22, "mn": 15,
    "sekolah": "SMKS PGRI 2 Jambi", "npsn": "", "penyusun": "", "npa": "",
    "rombel": "", "konsentrasi": "Teknik Sepeda Motor", "kota": "Jambi",
    "tahun": "2026/2027",
}


# ============================================================================
# 1. SIMPANAN IDENTITAS
# ============================================================================


def muat():
    data = dict(BAWAAN)
    if os.path.isfile(SIMPANAN):
        try:
            data.update(json.load(io.open(SIMPANAN, encoding="utf-8")))
        except Exception:
            pass
    return data


def simpan(data):
    try:
        with io.open(SIMPANAN, "w", encoding="utf-8") as f:
            f.write(json.dumps(data, ensure_ascii=False, indent=2))
    except Exception as e:
        print("   (catatan: identitas tidak tersimpan \u2014 %s)" % e)


def tanya(teks, bawaan=""):
    x = input("%s [%s]: " % (teks, bawaan)).strip()
    return x or bawaan


def angka(teks, bawaan):
    while True:
        x = tanya(teks, str(bawaan))
        try:
            return int(x)
        except ValueError:
            print("    \u274c Isikan angka.")


# ============================================================================
# 2. PENGISIAN DATA POKOK
# ============================================================================


def isi_data(data):
    print("")
    print("-" * 74)
    print(" DATA POKOK \u2014 dipakai bersama oleh ATP, RPM, dan KKTP")
    print("-" * 74)

    db = load_db()
    while True:
        mapel = tanya("[1] Mata Pelajaran", data.get("mapel", ""))
        calon = cari_mapel(db, mapel)
        if calon:
            break
        print("    \u274c Tidak ditemukan pada basis data CP. Coba kata kunci lain.")
    if len(calon) > 1:
        print("    Ditemukan beberapa mata pelajaran:")
        for i, x in enumerate(calon[:9], 1):
            print("      %d. %s  (Lampiran %s, %s)"
                  % (i, x["nama_asli"], x["lampiran"], x["kode"]))
        no = tanya("    Pilih nomor", "1")
        s = calon[int(no) - 1 if no.isdigit() and 0 < int(no) <= len(calon) else 0]
    else:
        s = calon[0]
    data["mapel"] = s["nama_asli"]
    print("    \u2713 %s  (Lampiran %s, %s)" % (s["nama_asli"], s["lampiran"], s["kode"]))

    data["kelas"] = tanya("[2] Kelas (X / XI / XII)", data.get("kelas", "X")).upper()
    fase = KELAS_FASE.get(data["kelas"], "E")
    print("    \u2192 Fase %s" % fase)

    while True:
        data["jp"] = angka("[3] JP dalam 1 minggu", data.get("jp", 2))
        data["tm"] = angka("[4] Jumlah pertemuan dalam 1 minggu", data.get("tm", 1))
        if data["tm"] >= 1 and data["jp"] % data["tm"] == 0:
            data["jpp"] = data["jp"] // data["tm"]
            print("    \u2192 %d pertemuan per minggu x %d JP = %d JP per minggu"
                  " (%d menit per pertemuan)"
                  % (data["tm"], data["jpp"], data["jp"], data["jpp"] * 45))
            break
        pas = [x for x in range(1, data["jp"] + 1) if data["jp"] % x == 0]
        print("    \u274c %d JP tidak habis dibagi %d pertemuan. Pilihan yang pas: %s"
              % (data["jp"], data["tm"], ", ".join(map(str, pas))))

    print("[5] Jumlah minggu efektif (minggu, bukan pertemuan)")
    data["mg"] = angka("      - Semester Ganjil", data.get("mg", 22))
    data["mn"] = angka("      - Semester Genap", data.get("mn", 15))

    print("[6] Identitas")
    data["sekolah"] = tanya("    Satuan Pendidikan", data.get("sekolah", ""))
    data["npsn"] = tanya("    NPSN", data.get("npsn", ""))
    data["rombel"] = tanya("    Kelas/rombel yang ditulis (mis. X TSM 1)",
                           data.get("rombel") or data["kelas"])
    data["konsentrasi"] = tanya("    Konsentrasi Keahlian", data.get("konsentrasi", ""))
    data["kota"] = tanya("    Kota/kabupaten", data.get("kota", "Jambi"))
    data["tahun"] = tanya("    Tahun Pelajaran", data.get("tahun", "2026/2027"))

    print("[7] Guru Mata Pelajaran (wajib diisi \u2014 untuk identitas dan tanda tangan)")
    print("    Kepala Sekolah sudah tetap: %s (%s)" % (KEPALA_NAMA, KEPALA_NPA))
    while True:
        data["penyusun"] = tanya("    Nama/Penyusun", data.get("penyusun", ""))
        if data["penyusun"].strip(". "):
            break
        print("    \u274c Nama Guru Mata Pelajaran harus diisi.")
    while True:
        data["npa"] = tanya("    NPA", data.get("npa", ""))
        if data["npa"].strip(". "):
            break
        print("    \u274c NPA Guru Mata Pelajaran harus diisi.")

    simpan(data)
    return data


def ringkas_data(data):
    fase = KELAS_FASE.get(data["kelas"], "E")
    print("")
    print("  Mapel        : %s" % (data["mapel"] or "(belum diisi)"))
    print("  Fase / Kelas : %s / %s   (rombel %s, %s)"
          % (fase, data["kelas"], data.get("rombel") or data["kelas"],
             data.get("konsentrasi", "-")))
    print("  Alokasi      : %d JP per minggu | %d JP per pertemuan | %d pertemuan per minggu"
          % (data["jp"], data["jpp"], max(1, data["jp"] // max(1, data["jpp"]))))
    print("  Minggu efektif: ganjil %d | genap %d" % (data["mg"], data["mn"]))
    print("  Guru Mapel   : %s  (%s)"
          % (data["penyusun"] or TITIK, npa_teks(data.get("npa"))))
    print("  Kepala       : %s  (%s)" % (KEPALA_NAMA, KEPALA_NPA))


# ============================================================================
# 3. PEMANGGIL TIAP DOKUMEN
# ============================================================================


def pilih_semester(data, izin_semua=True):
    """Tanyakan semester; kosong berarti seluruh semester aktif."""
    fase = KELAS_FASE.get(data["kelas"], "E")
    aktif = semester_aktif(fase, data["kelas"])
    print("    Semester aktif pada Kelas %s:" % data["kelas"])
    for a in aktif:
        print("      \u2022 %d \u2014 %s" % (a[0], a[1]))
    bawaan = "" if izin_semua else str(aktif[0][0])
    ket = "kosong = semua semester aktif" if izin_semua else "pilih satu"
    x = tanya("    Semester (%s)" % ket, bawaan)
    return x or None


def buat_atp(data, diam=False):
    print("")
    print("─" * 74)
    print(" MEMBUAT ATP")
    print("─" * 74)
    atp.generate(data["mapel"], data["jp"], kelas=data["kelas"], mg=data["mg"],
                 mn=data["mn"], jpp=data["jpp"], sekolah=data["sekolah"],
                 tahun=data["tahun"], penyusun=data["penyusun"], npa=data["npa"],
                 kota=data["kota"], diam=diam)


def buat_kktp(data, semester=None, diam=False):
    print("")
    print("─" * 74)
    print(" MEMBUAT KKTP")
    print("─" * 74)
    kktp.generate_kktp(data["mapel"], data["jp"], kelas=data["kelas"],
                       mg=data["mg"], mn=data["mn"], jpp=data["jpp"],
                       lingkup="semester" if semester else "tahun",
                       semester=semester, sekolah=data["sekolah"],
                       tahun=data["tahun"], penyusun=data["penyusun"],
                       npa=data["npa"], kota=data["kota"],
                       rombel=data.get("rombel"),
                       konsentrasi=data.get("konsentrasi", ""), diam=diam)


def buat_rpm(data, semester=None, elemen=None, topik_n=None, diam=False,
             bentuk=1):
    """RPM dengan lingkup 1 Materi Pokok = 1 berkas DOCX."""
    print("")
    print("─" * 74)
    print(" MEMBUAT RPM")
    print("─" * 74)
    fase = KELAS_FASE.get(data["kelas"], "E")
    daftar = [semester] if semester else [str(a[0]) for a in semester_aktif(fase, data["kelas"])]
    for sm in daftar:
        rpm.generate_rpm(data["mapel"], data["jp"], kelas=data["kelas"],
                         mg=data["mg"], mn=data["mn"], jpp=data["jpp"],
                         lingkup=("topik" if int(bentuk or 1) != 2 else "semester"),
                         semester=sm, elemen=elemen,
                         topik_n=topik_n, instansi=data["sekolah"],
                         npsn=data["npsn"] or TITIK, penyusun=data["penyusun"],
                         npa=data["npa"], rombel=data.get("rombel"),
                         kota=data["kota"], tahun=data["tahun"], diam=diam)


def tanya_bentuk():
    """Menanyakan bentuk berkas RPM. Keduanya memakai jumlah pertemuan dan JP
    yang sama dengan basis data ATP."""
    print("")
    print("    Bentuk berkas RPM (jumlah pertemuan & JP tetap mengikuti ATP):")
    print("      1. Otomatis \u2014 1 Materi Pokok = 1 berkas DOCX")
    print("      2. Hemat kertas \u2014 1 CP = 1 berkas DOCX"
          " (beberapa TP, beberapa pertemuan)")
    return 2 if tanya("    Pilihan [1/2]", "1").strip() == "2" else 1


def pratinjau(data):
    """Tampilkan rencana elemen, TP, dan pertemuan sebelum berkas dibuat."""
    fase = KELAS_FASE.get(data["kelas"], "E")
    r = atp.susun_rencana(data["mapel"], data["jp"], kelas=data["kelas"], fase=fase,
                          mg=data["mg"], mn=data["mn"], jpp=data["jpp"])
    print("")
    print("─" * 74)
    print(" RENCANA ISI DOKUMEN (dipakai sama oleh ATP, RPM, dan KKTP)")
    print("─" * 74)
    for a in semester_aktif(fase, data["kelas"]):
        sumber = detail_aktif(r, str(a[0]))
        if not sumber:
            continue
        print("  %s" % sumber[0]["label_semester"])
        for d in sumber:
            print("    %d. %s" % (d["urut_kelas"], topik_utama(d["elemen"])))
            print("       %d JP | %d pertemuan | %d Tujuan Pembelajaran"
                  % (d["jp"], d["tm"], len(daftar_tp([d]))))
        print("       Total: %d JP | %d pertemuan | %d Tujuan Pembelajaran"
              % (sum(d["jp"] for d in sumber), sum(d["tm"] for d in sumber),
                 len(daftar_tp(sumber))))


# ============================================================================
# 4. MENU
# ============================================================================


def menu():
    data = muat()
    print("")
    print("=" * 74)
    print("  GENERATOR PERANGKAT AJAR KURIKULUM NASIONAL 2025")
    print("  ATP  \u2022  RPM (Rancangan Pembelajaran Mendalam)  \u2022  KKTP")
    print("=" * 74)
    print("  Rujukan CP: Kepkabadan Kemendikdasmen No. 046/H/KR/2025")
    print("  Kepala Sekolah (tetap): %s \u2014 %s" % (KEPALA_NAMA, KEPALA_NPA))

    if not data.get("mapel") or not data.get("penyusun", "").strip(". "):
        data = isi_data(data)
    else:
        print("")
        print("  Data terakhir yang tersimpan:")
        ringkas_data(data)
        if tanya("\n  Pakai data ini? (y/t)", "y").lower().startswith("t"):
            data = isi_data(data)

    while True:
        ringkas_data(data)
        print("")
        print("-" * 74)
        print("  PILIH DOKUMEN YANG AKAN DIBUAT")
        print("-" * 74)
        print("    1. ATP  \u2014 Alur Tujuan Pembelajaran (1 berkas, 2 semester)")
        print("    2. RPM  \u2014 per Materi Pokok atau 1 CP = 1 berkas DOCX")
        print("    3. KKTP \u2014 Kriteria Ketercapaian Tujuan Pembelajaran")
        print("    4. PAKET LENGKAP \u2014 ATP + KKTP + RPM sekaligus (sinkron)")
        print("    5. RPM pengaturan lanjutan (pilih sendiri lingkup/TP)")
        print("    6. Lihat rencana isi dokumen (elemen, TP, pertemuan)")
        print("    7. Ubah data pokok / identitas")
        print("    0. Keluar")
        p = tanya("  Pilih nomor", "4")

        try:
            if p == "1":
                buat_atp(data)
            elif p == "2":
                sm = pilih_semester(data)
                bentuk = tanya_bentuk()
                el = ""
                if bentuk == 1:
                    el = tanya("    Nomor Elemen/CP (kosong = semua pada semester itu)", "")
                buat_rpm(data, semester=sm, bentuk=bentuk,
                         elemen=(int(el) if el.isdigit() else None))
            elif p == "3":
                sm = pilih_semester(data)
                buat_kktp(data, semester=sm)
            elif p == "4":
                print("")
                print("  Paket lengkap: ATP (2 semester) + KKTP tiap semester")
                print("  + RPM 1 Materi Pokok per berkas.")
                sm = pilih_semester(data)
                buat_atp(data)
                buat_kktp(data, semester=sm)
                buat_rpm(data, semester=sm, bentuk=tanya_bentuk())
                print("")
                print("  \u2713 ATP, KKTP, dan RPM selesai dibuat dan sudah sinkron.")
            elif p == "5":
                rpm.mode_form()
            elif p == "6":
                pratinjau(data)
            elif p == "7":
                data = isi_data(data)
            elif p == "0":
                print("\n  Selesai. Berkas berada di: %s\n" % BASE_OUT)
                return
            else:
                print("  \u274c Pilihan tidak dikenal.")
        except SystemExit:
            print("  (proses dihentikan)")
        except Exception as e:
            print("  \u274c Terjadi kesalahan: %s" % e)

        if tanya("\n  Buat dokumen lain? (y/t)", "y").lower().startswith("t"):
            print("\n  Selesai. Berkas berada di: %s\n" % BASE_OUT)
            return


if __name__ == "__main__":
    try:
        menu()
    except (KeyboardInterrupt, EOFError):
        print("\n  Dibatalkan.")
